<?php

/**
 * \file
 * Classe `Ref`.
 */
 
namespace pilar\Objects /* \cond */ ; /* \endcond */
{

/**
 * Référence d'un objet d'une entité.
 *
 * \since 07/03/2009
 * \author Matthieu OVIEDO <matthieu.oviedo@gmail.com>
 */
class Ref extends Member {

/**
 * Objet associé à la référence.
 *
 * Celui-ci peut être \c NULL, auquel cas cela signifie que la
 * référence n'as pas été évaluée.
 *
 * \since 07/03/2009
 */
private $_refObject = null;

public function domNode($domDoc) {
 if (!$this->isEvaluated()) {
  return parent::domNode($domDoc);
 } else {
  // Retour du noeud associé à l'objet évalué :
   return $this->refObject()->domNode($domDoc, $this->name());
 }
}


/**
 * Élément associé à la référence.
 *
 * \return Objet associé à la référence si il est évalué, $this sinon.
 *
 * \since 08/03/2009
 */
public function __getLink() {
 if($this->isEvaluated()) return $this->refObject();
 else return $this;
}


/**
 * Permet d'associer un objet à la référence en tant qu'objet
 * pointé.
 *
 * L'objet est supposé être cohérent avec l'entité associée à la
 * référence.
 *
 * \param $object Objet parent.
 *
 * \since 07/03/2009
 */
public function setRefObject(\pilar\Objects\Object $object) {
 $this->_refObject = $object;
}


/**
 * Objet pointé par la référence.
 *
 * \todo Générer une exception si l'objet n'a pas été évalué.
 *
 * \return Objet référencé.
 *
 * \since 07/03/2009
 */
public function refObject() {
 return $this->_refObject;
}


/**
 * Détermine si l'objet associé à la référence a été évalué.
 *
 * \return \c TRUE si l'objet est disponible, \c FALSE sinon.
 *
 * \since 07/03/2009
 */
public function isEvaluated() {
 return ($this->_refObject != null);
}


/**
 * Appelée lorsque l'objet parent est sauvegardé.
 *
 * \since 08/03/2009
 * \author Matthieu OVIEDO <matthieu.oviedo@gmail.com> 
 */
public function onSave() {
 if ($this->isEvaluated()) $this->refObject()->save();
}


} // Class.

} // Namespace.

?>
